/**
 * @file
 * @brief   网络命令类定义头文件。
 * @author  赵一
 * @date    2012/08/01
 * @version 0.1
 */

#ifndef _NetController_h_
#define _NetController_h_

#include "Global.h"
#include "NCDefines.h"

#if ((CC_TARGET_PLATFORM != CC_PLATFORM_IOS) && (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32))
#   error "No support platform
#endif

#define Post_Net_Notification(ncName, params) \
CCLog("PostNotification:%s", ncName);   \
NotificationCenter::getSingletonPtr()->postNotification(ncName, params);

/**
 * @class NetController
 * @brief 网络命令类。
 * @note  通过对于网络基础类的调用实现逻辑命令组装发送与接收解析。
 */
class NetController : public Singleton<NetController>
{
public:
    /**
     * @brief 构造函数。
     * @note  初始化内部变量。
     */
    NetController();

    /**
     * @brief 析构函数。
     */
    ~NetController();

    /**
     * @brief     初始化函数。
     * @param[in] url   服务器地址URL。
     * @return    true  成功。
     * @return    false 失败。
     * @note      初始化网络命令参数。
     */
    bool init(const char* url);

    /**
     * @brief     数据解析函数。
     * @param[in] data 接收到的数据。
     * @note      解析数据包的基础信息，并根据命令名称进行命令分解调用。(用于网络接口回调使用)
     */
    void parseData(void* data);

    /**
     * @brief 网络错误处理函数。
     * @note  解析网络错误信息。(用于网络接口回调使用)
     */
    void receiveError();

    /**
     * @brief  游戏初始化命令函数。
     * @return true  成功。
     * @return false 失败。
     * @note   发送游戏初始化命令到服务器。
     */
    bool gameInit();

    /**
     * @brief  游戏加载命令函数。
     * @return true  成功。
     * @return false 失败。
     * @note   发送游戏加载命令到服务器。
     */
    bool gameLoad();

    /**
     * @brief     注册命令函数。
     * @param[in] name  用户名称。
     * @param[in] avata 用户形象。
     * @return    true  成功。
     * @return    false 失败。
     * @note      发送注册命令到服务器。
     */
    bool regist(const std::string& name, const int avata);

    /**
     * @brief  取得自己的用户信息命令函数。
     * @return true  成功。
     * @return false 失败。
     * @note   发送取得用户信息命令到服务器。
     */
    bool getSelfInfo();

    /**
     * @brief     取得指定的用户信息命令函数。
     * @param[in] gid   用户gid。
     * @return    true  成功。
     * @return    false 失败。
     * @note      发送取得用户信息命令到服务器。
     */
    bool getInfo(int gid);

    /**
     * @brief     地下城探险命令函数。
     * @param[in] dungeon 地下城ID。
     * @param[in] floor   地下城层级ID。(地下城中的子ID)
     * @param[in] task    地下城任务ID。(层级中的子ID)
     * @return    true    成功。
     * @return    false   失败。
     * @note      发送地下城探险命令到服务器。
     */
    bool dungeonExplore(int dungeon, int floor, int task);

    /**
     * @brief     潜能点分配命令函数。
     * @param[in] energyCur 向用户当前能量值中所追加分配的潜能点。
     * @param[in] life      向用户生命值中所追加分配的潜能点。
     * @return    true      成功。
     * @return    false     失败。
     * @note      发送潜能点分配命令到服务器。
     */
    bool allotProficiency(int energyCur, int life);

    /**
     * @brief     加载装备命令函数。
     * @param[in] index 装备在用户背包中的索引。
     * @return    true  成功。
     * @return    false 失败。
     * @note      发送加载装备命令到服务器。
     */
    bool loadEquipage(int index);

    /**
     * @brief     卸载装备命令函数。
     * @param[in] index 装备在用户背包中的索引。
     * @return    true  成功。
     * @return    false 失败。
     * @note      发送卸载装备命令到服务器。
     */
    bool unloadEquipage(int index);

    /**
     * @brief     贩卖装备命令函数。
     * @param[in] indexArray 装备在用户背包中的索引数组。
     * @return    true       成功。
     * @return    false      失败。
     * @note      发送贩卖装备命令到服务器。
     */
    bool sellEquipage(std::vector<int>& indexArray);

    /**
     * @brief     洗练装备命令函数。
     * @param[in] index 装备在用户背包中的索引。
     * @return    true  成功。
     * @return    false 失败。
     * @note      发送洗练装备命令到服务器。
     */
    bool resetEquipage(int index);

    /**
     * @brief     熔炼装备命令函数。
     * @param[in] indexArray 装备在用户背包中的索引数组。
     * @return    true       成功。
     * @return    false      失败。
     * @note      发送熔炼装备命令到服务器。
     */
    bool fusionEquipage(std::vector<int>& indexArray);

    /**
     * @brief     强化装备命令函数。
     * @param[in] index  装备在用户背包中的索引。
     * @param[in] number 助溶剂数量。
     * @return    true   成功。
     * @return    false  失败。
     * @note      发送熔炼装备命令到服务器。
     */
    bool intensifyEquipage(int index, int number);

    /**
     * @brief     搜素需要挑战的玩家命令函数。
     * @param[in] name  需要挑战的玩家名称。
     * @return    true  成功。
     * @return    false 失败。
     * @note      发送搜素需要挑战的玩家命令到服务器。
     */
    bool findChallengePlayer(const std::string& name);

    /**
     * @brief  请求挑战玩家列表命令函数。
     * @return true  成功。
     * @return false 失败。
     * @note   发送请求挑战玩家列表命令到服务器。
     */
    bool getChallengeList();

    /**
     * @brief  请求宿敌列表命令函数。
     * @return true  成功。
     * @return false 失败。
     * @note   发送请求宿敌列表命令到服务器。
     */
    bool getChallengeEnemyList();

    /**
     * @brief     挑战对手命令函数。
     * @param[in] pid   对手的pid
     * @return    true  成功。
     * @return    false 失败。
     * @note      发送挑战对手命令到服务器。
     */
    bool challengePlayer(const int pid);

private:
    /**
     * @brief     发送网络命令函数。
     * @param[in] cmd   命令名称。
     * @param[in] data  命令数据。
     * @return    true  成功。
     * @return    false 失败。
     * @note      发送网络命令到服务器。(对外发布的命令发送接口的共同私有接口)
     */
    bool _sendCommand(const string& cmd, void* data);

    /**
     * @brief      服务器处理错误函数。
     * @param[in]  cmd 命令。
     * @param[out] error 错误代码。
     */
    void _parseError(std::string cmd, int error);

    /**
     * @brief     游戏初始化命令返回数据解析函数。
     * @param[in] params 接收到的数据。
     */
    void _parseGameInit(void* params);

    /**
     * @brief     游戏加载命令返回数据解析函数。
     * @param[in] params 接收到的数据。
     */
    void _parseGameLoad(void* params);

    /**
     * @brief     注册命令返回数据解析函数。
     * @param[in] params 接收到的数据。
     */
    void _parseRegist(void* params);

    /**
     * @brief     取得用户信息命令返回数据解析函数。
     * @param[in] params 接收到的数据。
     */
    void _parseGetSelfInfo(void* params);

    /**
     * @brief     取得用户信息命令返回数据解析函数。
     * @param[in] params 接收到的数据。
     */
    void _parseGetInfo(void* params);

    /**
     * @brief     地下城探险命令返回数据解析函数。
     * @param[in] params 接收到的数据。
     */
    void _parseDungeonExplore(void* params);

    /**
     * @brief     潜能点分配命令返回数据解析函数。
     * @param[in] params 接收到的数据。
     */
    void _parseAllotProficiency(void* params);

    /**
     * @brief     返回数据解析函数。
     * @param[in] params 接收到的数据。
     */
    void _parseLoadEquipage(void* params);

    /**
     * @brief     卸载装备命令返回数据解析函数。
     * @param[in] params 接收到的数据。
     */
    void _parseUnloadEquipage(void* params);

    /**
     * @brief     贩卖装备命令返回数据解析函数。
     * @param[in] params 接收到的数据。
     */
    void _parseSellEquipage(void* params);

    /**
     * @brief     洗练装备命令返回数据解析函数。
     * @param[in] params 接收到的数据。
     */
    void _parseResetEquipage(void* params);

    /**
     * @brief     熔炼装备命令返回数据解析函数。
     * @param[in] params 接收到的数据。
     */
    void _parseFusionEquipage(void* params);

    /**
     * @brief     强化装备命令返回数据解析函数。
     * @param[in] params 接收到的数据。
     */
    void _parseIntensifyEquipage(void* params);

    /**
     * @brief      获取挑战玩家列表函数。
     * @param[in]  data 任务数据。
     * @param[out] info 任务信息。
     */
    void _parseGetChallengeList(void* params);

    /**
     * @brief     挑战命令返回数据解析函数。
     * @param[in] params 接收到的数据。
     */
    void _parseChallengePlayer(void* params);

    /**
     * @brief     获取宿敌列表信息命令返回数据解析函数。
     * @param[in] params 接收到的数据。
     */
    void _parseGetChallengeEnemyList(void* params);

    /**
     * @brief     查找挑战玩家信息命令返回数据解析函数。
     * @param[in] params 接收到的数据。
     */
    void _parseFindChallengePlayer(void* params);

    /**
     * @brief  取得PID函数。
     * @return PID。
     */
    std::string _getPid();

    /**
     * @brief  取得平台类型函数。
     * @return 平台类型。
     */
    int _getPlatform();

    /**
     * @brief  取得网络命令版本号函数。
     * @return 网络命令版本号。
     */
    std::string _getVersion();

    /**
     * @brief      解析装备函数。
     * @param[in]  data 装备数据。
     * @param[out] info 装备信息。
     */
    void _parseEquipageInfo(void* data, void* info);

    /**
     * @brief      解析道具函数。
     * @param[in]  data 道具数据。
     * @param[out] info 道具信息。
     */
    void _parsePropInfo(void* data, void* info);

    /**
     * @brief      解析任务函数。
     * @param[in]  data 任务数据。
     * @param[out] info 任务信息。
     */
    void _parseTaskInfo(void* data, void* info);

    /**
     * @brief      解析挑战宿敌函数。
     * @param[in]  data 挑战宿敌数据。
     * @param[out] info 挑战宿敌信息。
     */
    void _parseChallengeEnemyList(void* data, void* info);
    
    /**
     * @brief      解析挑战玩家函数。
     * @param[in]  data 挑战宿敌数据。
     * @param[out] info 挑战宿敌信息。
     */
    void _parseChallengeEnemyInfo(void* data, void* info, bool isParseEnemy=true);
    
    void _getSelfInfo(void* params);

private:
    /**
     * @brief 平台类型。
     */
    int mPlatform;

    /**
     * @brief 用户PID。
     */
    std::string mPid;

    /**
     * @brief 网络命令版本号。
     */
    std::string mVersion;

    /**
     * @brief 用户GID。(通过注册命令返回的信息中读取)
     */
    int mGid;
};

#endif
